package com.t21;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousCloseException;
import java.nio.channels.ClosedByInterruptException;
import java.nio.channels.SocketChannel;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

import static net.mindview.util.Print.print;

/**
 * Created by xuyiwei on 2018/9/23.
 */
class NIOBlocked implements Runnable{
    private final SocketChannel sc;
    public NIOBlocked(SocketChannel sc) {
        this.sc = sc;
    }
    @Override
    public void run() {
        try {
            print("Waiting for read() in "+this);
            sc.read(ByteBuffer.allocate(1));
        }catch (ClosedByInterruptException e){
            print("ClosedByInterruptException");
        }catch (AsynchronousCloseException e){
            print("AsynchronousCloseException");
        }catch (IOException e){
            throw new RuntimeException(e);
        }
        print("Exiting NIOBlocked.run() "+this);
    }
}
public class NIOInterrruption {
    public static void main(String[] args) throws Exception {
        ExecutorService exec = Executors.newCachedThreadPool();
        ServerSocket server = new ServerSocket(8080);
        InetSocketAddress isa = new InetSocketAddress("localhost",8080);
        SocketChannel sc1 = SocketChannel.open(isa);
        SocketChannel sc2 = SocketChannel.open(isa);
        Future<?> future = exec.submit(new NIOBlocked(sc1));
        exec.execute(new NIOBlocked(sc2));
        exec.shutdown();
        TimeUnit.SECONDS.sleep(1);
        future.cancel(true);
        TimeUnit.SECONDS.sleep(1);
        sc2.close();
        /**
         * Waiting for read() in com.t21.NIOBlocked@4d740d3a
         Waiting for read() in com.t21.NIOBlocked@352de9f4
         ClosedByInterruptException
         Exiting NIOBlocked.run() com.t21.NIOBlocked@4d740d3a
         AsynchronousCloseException
         Exiting NIOBlocked.run() com.t21.NIOBlocked@352de9f4
         */
    }
}
